#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

//进程程序替换

int main()
{
    printf("I am a process, pid: %d\n", getpid());
    pid_t id = fork();
    if(id == 0)
    {
        char *const argv[] = {
            (char*)"ls",
            (char*)"-a",
            (char*)"-l"
        };
        sleep(3);
        printf("exec begin...\n");
        execvp("ls", argv);
        //execv("/usr/bin/ls", argv);
        //execl("/usr/bin/ls", "ls", "-a", "-l", NULL);
        //execlp("ls", "ls", "-a", "-l", NULL);
        printf("exec end...\n");
        exit(1);
    }
    pid_t rid = waitpid(id, NULL, 0);
    if(rid>0)
    {
        printf("wait success\n");
    }
    exit(1);
}

//int main()
//{
//    printf("I am a process, pid: %d\n", getpid());
//    printf("exec begin...\n");
//    //execl("usr/bin/ls", "ls", "-a", "-l", NULL);
//    
//    execl("/usr/bin/top", "top", NULL);
//    printf("exec end...\n");
//    return 0;
//}


//int sub_exitcode=0;
//int sub_exitsigno=0;
//int main()
//{
//    pid_t id = fork();
//    if(id == 0)
//    {
//        int cnt = 5;
//        while(cnt--)
//        {
//            printf("I am a process, pid: %d, ppid: %d, cnt: %d\n", getpid(), getppid(), cnt);
//            sleep(1);
//        }
//        sleep(1);
//        sub_exitcode=111;
//        exit(111);
//    }
//    // 非阻塞
//    int status = 0;
//    while(1)
//    {
//        pid_t rid = waitpid(id, &status, WNOHANG);
//        if(rid>0)
//        {
//            printf("wait success, rid: %d, status: %d, exit code: %d\n", rid, status, WEXITSTATUS(status));
//            break;
//        }
//        else if(rid == 0)
//        {
//            printf("father say: child is running, do other things\n");
//        }
//        else{
//            perror("waitpid");
//            break;
//        }
//        sleep(1);
//    }
//
//
//    //阻塞
//    //int status=0;
//    //pid_t rid = waitpid(id, &status, 0);
//    //if(rid>0)
//    //{
//    //    if(WIFEXITED(status))
//    //    {
//    //        printf("wait success, rid: %d, status: %d, exit code: %d\n", rid, status, WEXITSTATUS(status));
//    //    }
//    //    else{
//    //        printf("child process error!\n");
//    //    }
//    //}
//    return 0;
//}

// 父进程回收僵尸进程
//int main()
//{
//    pid_t id = fork();
//    if(id == 0)
//    {
//        int cnt = 5;
//        while(cnt--)
//        {
//            printf("child process running, pid: %d, ppid: %d\n", getpid(), getppid());
//            sleep(1);
//        }
//        printf("子进程准备退出，马上变成僵尸进程\n");
//        exit(1);
//    }
//    printf("父进程休眠\n");
//    //sleep(15);
//    printf("父进程开始回收\n");
//    int status = 0;
//    pid_t rid = waitpid(id, &status, 0);//阻塞等待
//    if(rid>0)
//    {
//        printf("wait success, rid: %d, status: %d\n", rid, status);
//    }
//    printf("父进程回收僵尸成功\n");
//    //sleep(10);
//    return 0;
//}
